// sagas.js
import { all, call, delay, put, takeEvery } from 'redux-saga/effects'

// Sagas 被实现为 Generator functions，它会 yield 对象到 redux-saga middleware。
// 被 yield 的对象都是一类指令，指令可被 middleware 解释执行。

export function* helloSaga() {
    console.log('Hello Sagas!');
}


// Our worker Saga: 将执行异步的 increment 任务
export function* incrementAsync() {
    // 当 middleware 取得一个 yield 后的 Promise，middleware 会暂停 Saga，直到 Promise 完成。
    // incrementAsync 这个 Saga 会暂停直到 delay 返回的 Promise 被 resolve，
    // 这个 Promise 将在 1 秒后 resolve。
    yield delay(1000)
    yield put({ type: 'INCREMENT' })
}


// 接下来，我们创建了另一个 Saga watchIncrementAsync。
// Our watcher Saga: 在每个 INCREMENT_ASYNC action spawn 一个新的 incrementAsync 任务
export function* watchIncrementAsync() {
    // 我们用了一个 redux-saga 提供的辅助函数 takeEvery，用于监听所有的 INCREMENT_ASYNC action，
    // 并在 action 被匹配时执行 incrementAsync 任务。
    yield takeEvery('INCREMENT_ASYNC', incrementAsync)
}

// notice how we now only export the rootSaga
// single entry point to start all Sagas at once
// 现在我们有了 2 个 Sagas，我们需要同时启动它们。
// 为了做到这一点，我们将添加一个 rootSaga，负责启动其他的 Sagas。
export default function* rootSaga() {
    // 这个 Saga yield 了一个数组，值是调用 helloSaga 和 watchIncrementAsync 两个 Saga 的结果。
    // 意思是说这两个 Generators 将会同时启动。
    yield all([
        call(helloSaga),
        call(watchIncrementAsync)
    ])
}